package com.sjz.myfrist;

import android.annotation.SuppressLint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

/***
 * 靠近设备就黑屏
 */
public class SensorActivity3 extends AppCompatActivity  implements SensorEventListener {
    private SensorManager sensorManager;

    /*使用电量管理器控制屏幕的熄灭和唤醒*/
    private PowerManager pm;
    private PowerManager.WakeLock wakeLock;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sensor_demo_three_id);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        pm = (PowerManager) getSystemService(POWER_SERVICE);
        closeOrClose();
    }

    /**
     * 初始化唤醒锁wakeLock,直接使用内置PROXIMITY_SCREEN_OFF_WAKE_LOCK，
     * 就可以直接实现靠近熄灭屏幕的功能
     *
     * 初始化完要调用acquire()方法启用
     */
    @SuppressLint("InvalidWakeLockTag")
    private void closeOrClose() {
        wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK,
                "w1");
        wakeLock.setReferenceCounted(false);
        wakeLock.acquire();
    }

    @Override
    protected void onResume() {
        /*注册距离传感器，只有注册了距离传感器唤醒锁才有效果*/
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
                SensorManager.SENSOR_DELAY_NORMAL);
        super.onResume();
    }

    @Override
    protected void onStop() {
        /*释放传感器和唤醒锁*/
        wakeLock.release();
        sensorManager.unregisterListener(this);
        super.onStop();
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

/***
 •WakeLock级别：
 –    PARTIAL_WAKE_LOCK       保持CPU运转，屏幕和键盘背光可能关闭
 –    SCREEN_DIM_WAKE_LOCK    保持CPU运转，保持屏幕常亮(亮度低)，键盘背光可能关闭
 –    SCREEN_BRIGHT_WAKE_LOCK 保持CPU运转，保持屏幕和键盘背光高亮
 –    FULL_WAKE_LOCK          保持CPU运转，保持屏幕和键盘背光高亮(亮度最高)
 –    ACQUIRE_CAUSES_WAKEUP            强制亮屏，针对一些必须通知用户的操作
 –    ON_AFTER_RELEASE                 当锁被释放时，保持亮屏一段时间(如果释放时屏幕没亮，则不会亮屏)
 –    PROXIMITY_SCREEN_OFF_WAKE_LOCK   和接近传感器配合,当用户接近屏幕时黑屏,离开时亮屏(例如打电话)
 •WakeLock方法:
 –    void acquire()              获得WakeLock，除非显式释放，否则不会解锁（经测试,APP进程被杀死后,锁会失效）
 –    void acquire(long timeOut)  当超过timeOut之后系统自动释放WakeLock
 –    void release()              释放WakeLock
 –    boolean isHeld()            是否已经获取WakeLock
 –    void setReferenceCounted(boolean value) 是否使用引用计数(默认ture): 一个WakeLock调用acquire()多次,也必须release()多次才能释放,    如果释放次数比acquire()多,则抛出异常: java.lang.RuntimeException: WakeLock under-locked MyTAG
 可参考下面文章：
 https://www.jianshu.com/p/2cfd179ef8dc
 https://blog.csdn.net/fengyeNom1/article/details/121373158
 ————————————————

 版权声明：本文为博主原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接和本声明。

 原文链接：https://blog.csdn.net/Tir_zhang/article/details/130536824
 * */



}